home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 47
/
Amiga Format AFCD47 (Issue 131, Xmas 1999).iso
/
-screenplay-
/
shareware
/
mre
/
connect-4.amos
/
connect-4.amosSourceCode
< prev
next >
Wrap
AMOS Source Code
|
1999-10-04
|
5KB
|
220 lines
'*******************************************
'* Connect-4 � Mr E Software
'*******************************************
Randomize Timer
Dim BOARD(71),Y(6),DD(3),BVAL(71),C$(2)
Global BOARD(),BVAL(),Y(),DD(),XMOVE,WIN
C$(1)="RED "
C$(2)="YELLOW "
Say "."
Do
SETUP
PLYER=1
Print At(0,0);" A:amiga v human B:human v amiga"
Print At(0,1);" C:human v human D:amiga v amiga"
GAME=0
Do
Wait 1
Inc GAME
If Mouse Click and Mouse Zone and Y Screen(Y Mouse)<16 Then GAME=Y Screen(Y Mouse)/8*2+X Screen(X Mouse)/160 : Exit
F=Instr("ABCDQ",Upper$(Inkey$)) : If F Then GAME=F-1 : Exit
If GAME=1500 Then GAME=3 : Exit
Loop
If GAME=4 Then End
Cls 0,0,0 To 320,16
If GAME=3 Then Hide
LEVEL=1
For F=0 To 41
If(PLYER=1 and(GAME=0 or GAME=3)) or(PLYER=2 and(GAME=1 or GAME=3))
Hide
EVALUATE[PLYER,LEVEL,LEVEL,0,6]
Show
Exit If GAME=3 and Mouse Click
Else
Repeat
Do
If Mouse Click and Mouse Zone : XMOVE=(X Screen(X Mouse)-48)/32 : Exit : End If
XMOVE=Instr("1234567",Inkey$) : If XMOVE : Dec XMOVE : Exit : End If
Loop
Until Y(XMOVE)>8
End If
X=(Y(XMOVE) mod 9)*32+16 : Y=(Y(XMOVE)/9)*32
For YY=-32 To Y Step 8
Bob 1,X,YY,PLYER
Wait Vbl
Next YY
Paste Bob X,Y,PLYER
WIN=0
EVALUATE[PLYER,0,0,XMOVE,XMOVE]
Exit If WIN
BOARD(Y(XMOVE))=PLYER
Add Y(XMOVE),-9
PLYER=(PLYER xor 3)
Next F
Print At(0,0);
If WIN
If(PLYER=1 and GAME=0) or(PLYER=2 and GAME=1)
Centre "I WIN!" : Say "I WIN."
Else
If GAME<2
Centre "YOU WIN!" : Say "YOU WIN."
Else
Centre C$(PLYER)+"WINS!" : Say C$(PLYER)+"WINS."
End If
End If
Else
Centre "IT'S A DRAW!" : Say "ITS A DRAW."
End If
Print : Centre "Press a key..."
Bob Off
Clear Key
For F=1 To 500
Wait 1
Exit If(Inkey$<>"") or Mouse Key
Next F
If GAME=3 Then Show
Loop
Procedure SETUP
Screen Open 0,320,256,16,Lowres
Flash Off : Curs Off : Paper 0 : Cls : Screen Hide 0
Get Sprite Palette
Reserve Zone 1
Set Zone 1,48,0 To 271,255
Wait Vbl : Limit Mouse
Ink 7
For F=0 To 71
Read BOARD(F)
Paste Bob(F mod 9)*32+16,(F/9)*32,BOARD(F)
Next F
Ink 10,0
For F=0 To 6 : Text 60+32*F,248,Chr$(F+49) : Next F
Double Buffer : Screen Show 0
For F=0 To 71 : Read BVAL(F) : Next F
For F=1 To 7 : Y(F-1)=F : Next F
For F=0 To 6 : While BOARD(Y(F)+9)=3 : Add Y(F),9 : Wend : Next F
For F=0 To 3 : Read DD(F) : Next F
Set Bob 1,,7,
Set Bob 2,,7,
Data 8,7,7,7,7,7,7,7,9
Data 4,3,3,3,3,3,3,3,5
Data 4,3,3,3,3,3,3,3,5
Data 4,3,3,3,3,3,3,3,5
Data 4,3,3,3,3,3,3,3,5
Data 4,3,3,3,3,3,3,3,5
Data 4,3,3,3,3,3,3,3,5
Data 11,6,6,6,6,6,6,6,10
Data 0,0,0,0,0,0,0,0,0
Data 0,0,2,4,4,4,2,0,0
Data 0,0,2,4,4,4,2,0,0
Data 0,0,2,4,4,4,2,0,0
Data 0,0,2,4,4,4,2,0,0
Data 0,0,2,4,4,4,2,0,0
Data 0,0,2,4,7,4,2,0,0
Data 0,0,0,0,0,0,0,0,0
Data -1,10,8,9
End Proc
Procedure EVALUATE[COUNTER,PLY,LEVEL,XSTART,XEND]
TVAL=-999999
For X=XSTART To XEND
If Y(X)>8
EVAL=-1
For C=32 To 48 Step 16
For D=0 To 3+(PLY<>LEVEL)
E=C+BVAL(Y(X))+Rnd(4)
V=0
P=Y(X)+DD(D)
While BOARD(P)=COUNTER
Add P,DD(D)
Add E,32
Inc V
Wend
While(BOARD(P)=COUNTER or BOARD(P)=3) and V<3
Add P,DD(D)
Inc V
Wend
P=Y(X)-DD(D)
While BOARD(P)=COUNTER
Add P,-DD(D)
Add E,32
Inc V
Wend
While(BOARD(P)=COUNTER or BOARD(P)=3) and V<3
Add P,-DD(D)
Inc V
Wend
E=E*-(V>2)
If E>127 : TVAL=10000+C : If C=32 : WIN=-1 : End If : MOVE=X : Exit 3 : End If
If E>EVAL : EVAL=E : End If
Next D
COUNTER=(COUNTER xor 3)
Next C
If PLY
BOARD(Y(X))=COUNTER : Add Y(X),-9
EVALUATE[COUNTER,PLY-1,LEVEL,X,X]
Add EVAL,-Param
Add Y(X),9 : BOARD(Y(X))=3
End If
If EVAL>TVAL : TVAL=EVAL : MOVE=X : End If
' If PLY=LEVEL : Print At(X*4+6,29+(X and 1));EVAL;" " : End If
End If
Next X
If PLY=LEVEL Then XMOVE=MOVE
End Proc[TVAL]